package com.shiyun.disaster_station.utils;

import cn.hutool.core.util.NumberUtil;
import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;
import org.springframework.stereotype.Component;

/**
 * 类  描述: 位置信息的工具
 * 作   者: 史 云
 * @author 史云
 * 时   间: 2021年12月01日 18:28:00
 */
@Component
public class LocUtils {
    final static GeodeticCalculator geodeticCalculator = new GeodeticCalculator();

    /**
     * 方法描述: 获取距离：单位米
     * 作    者: 史 云
     * 时    间: 2022年06月02日  15:37:50
     */
    public Integer calculateMeter(Double lat, Double lon, Double nextLat, Double nextLon) {
        return NumberUtil.round(calculateMileage(lat, lon, nextLat, nextLon), 0).intValue();
    }

    /**
     * 方法描述: 获取两点间的公里数
     * 作    者: 史 云
     * 时    间: 2022年06月02日  15:38:43
     */
    public static Double calculateKilometre(Double lat, Double lon, Double nextLat, Double nextLon) {
        return NumberUtil.div(calculateMileage(lat, lon, nextLat, nextLon), 1000.0, 3);
    }

    /**
     * 方法描述: 获取距离：单位米
     * 作    者: 史 云
     * 时    间: 2022年06月02日  15:46:23
     */
    private static double calculateMileage(Double lat, Double lon, Double nextLat, Double nextLon) {
        //获取点坐标对象
        GlobalCoordinates start = new GlobalCoordinates(lat, lon);
        GlobalCoordinates end = new GlobalCoordinates(nextLat, nextLon);
        //获取计算器
        GeodeticCurve geoCurve = geodeticCalculator.calculateGeodeticCurve(Ellipsoid.WGS84, start, end);
        return geoCurve.getEllipsoidalDistance();
    }

}
